package main

import (
	"bytes"
	"fmt"
	"unicode"
)

func main() {
	// buffer写入
	write()
	bufferNew()
	byteDemo()
}

func write(){
	var b bytes.Buffer // 声明buffer
	b.Grow(64)	// 增加buffer容易

	b.WriteString("hello ") // 写入字符串
	b.WriteByte('W')  // 写入单个byte
	b.WriteRune('o') // 写入单个rune
	b.Write([]byte("rld!")) // 写入byte
	fmt.Printf("%s\n", b.Bytes())

}

func bufferNew() {
	str := "hello world!"
	buf := bytes.NewBufferString(str)  // 根据字符串创建buffer
	fmt.Printf("%s\n", buf.Bytes())

	bufSlice := []byte(str)
	fmt.Println(len(bufSlice), cap(bufSlice))
	buf = bytes.NewBuffer(bufSlice)  // 根据byte创建buffer
	buf.WriteString("abc")
	fmt.Printf("%s\n", buf.Bytes())
	fmt.Println(buf.Len(), buf.Cap())

}


func byteDemo() {
	var a, b, c []byte
	a = append(a, 256)
	fmt.Println(a)

	bytes.NewReader([]byte("Hello World!"))  // 根据[]byte创建reader
	compare := bytes.Compare(a, b)  // 比较a和b，返回0: a==b   1: a > b  -1: a < b
	fmt.Println(compare)
	bytes.Equal(a, b)  // 判断a与b是否相同
	bytes.EqualFold(a, b) // 判断a与b是否相同，忽略大小写
	bytes.HasPrefix(a, b)  // 判断a是否以b开头，当b为空时true
	bytes.HasSuffix(a, b)  // 判断a是否以b结尾，当b为空是true

	bytes.TrimSuffix(a, b) // 如果a以b结尾，则返回去除b之后的a; 如果不是，返回a
	bytes.TrimPrefix(a, b)  // 如果a以b开头，则返回去除b之后的a; 如果不是，返回a
	bytes.TrimSpace(a)  // 去除开头结尾所有的 空格换行回车缩进
	bytes.Trim(a, " ")  // 去除开头结尾所有的  指定字符串中的任意字符
	bytes.TrimFunc(a, unicode.IsLetter) // 去除开头结尾满足指定 func(r rune) bool 函数的
	bytes.TrimLeft(a, "01234567890") // 去除开头所有的， 指定字符串中的任意字符
	bytes.TrimLeftFunc(a, unicode.IsLetter)  // 去除开头所有的， 满足函数的内容
	bytes.TrimRight(a, "0123456789")  // 去除开头所有的， 指定字符串中的任意字符
	bytes.TrimRightFunc(a, unicode.IsLetter)  // 去除结尾所有的， 满足函数的内容

	bytes.Fields([]byte(" foo  bar  baz   ")) // 以一个或者多个空格分割成切片
	bytes.FieldsFunc([]byte(" foo1;bar2,baz3..."), func(r rune) bool {
		return !unicode.IsLetter(r) && !unicode.IsNumber(r) // 以不是字符或者数字进行切分
	})

	bytes.Contains(a, b)  // 判断a是滞包含b
	// 判断byte切片中是否包含任意字符串中任意字符，只要包含字符串中一个及以上字符返回true,else 返回false
	bytes.ContainsAny([]byte("I like seafood."), "fbb")
	bytes.ContainsRune([]byte("I like seafood."), 'f') // 判断byte是否包含rune字符
	bytes.Count(a, b)  // 统计a中包含所有b的个数，如果b为空则返回a中字符个数+1
	bytes.Index(a, b)  // 检索a中首个b的位置，未检索到返回-1
	bytes.IndexByte(a, byte('k'))  // 检索a中首个byte类型字符的位置，未检索到返回-1
	// 自定义方法检索首个字符的位置索引，未检索到返回-1
	bytes.IndexFunc([]byte("Hello, 世界"), func(c rune) bool {
		return unicode.Is(unicode.Han, c )  // 是否包含中文字符
	})
	bytes.IndexAny(a, "abc") // 检索a中首个字符串中任意字符的位置，未检索到返回-1
	bytes.IndexRune([]byte("chicken"), 'k') // 检索a中首个rune类型字符的位置，未检索到返回-1
	bytes.LastIndex(a, b)  // 检索a中最后个b的位置，未检索到返回-1
	bytes.LastIndexByte(a, byte('k')) // 检索a中最后个byte类型字符的位置，未检索到返回-1
	bytes.LastIndexFunc(a, unicode.IsLetter) // 自定义检索方法检索最后个字符的位置，未检索-1


	s := [][]byte{a, b}
	bytes.Join(s, []byte(",")) // 将byte数组以指定byte字符，连接成一个新的byte
	bytes.Repeat(a, 2)  // 返回一个重复n次a的新byte
	// 返回一个将a中的b换成c的新[]byte,n为替换个数， -1为替换所有
	bytes.Replace(a, b, c, -1)
	bytes.Runes(a)  // byte类型转rune类型


	bytes.Split(a, []byte(","))  // 将a以指定字符byte分割成byte数组
	// 将a以指定字符byte分割成byte数组，n为分割个数，-1分割所有
	bytes.SplitN(a, []byte(","), 2)
	bytes.SplitAfter(a, []byte(","))
	bytes.SplitAfterN(a, []byte(","), 2)

	bytes.Title(a) // 返回一个以空格为界，所有首个字母大写的标题格式
	bytes.ToTitle(a)  // 返回一个所有字母大写的
	bytes.ToTitleSpecial(unicode.SpecialCase{}, a)












	
}